﻿/**
 * 表格的一种特殊功能，当这个功能触发的时候，会显示一个窗口（可以配置不同的显示策略）。
 * 
 * @abstract
 */
Ext.define('Happy.table.action.ShowAction', {
    extend: 'Happy.Action',
    requires: ['Happy.table.action.show.strategy.Window'],

    /**
     * @readonly
     * @property 默认显示策略。
     */
    DEFAULT_SHOW_STRATEGY: 'Happy.table.action.show.strategy.Window',

    constructor: function (config) {
        var me = this;

        config = config || {};

        me.configShowStrategy(config.showStrategy);

        me.callParent([config]);
    },

    /**
     * 配置显示策略。
     *
     * @private
     * @param {String|Object} showStrategy
     */
    configShowStrategy: function (showStrategy) {
        var me = this;

        if (Ext.isString(showStrategy)) {
            showStrategy = { type: showStrategy };
        }
        else {
            Ext.applyIf(showStrategy, { type: me.DEFAULT_SHOW_STRATEGY });
        }

        me.showStrategy = Ext.create(showStrategy.type, showStrategy);
    },

    /**
     * @inheritdoc
     */
    onClickHandler: function (button) {
        var me = this;

        var table = me.up(button, me.initialConfig.tableSelector);
        var record = table.getFirstSelected();

        me.showRecord(table, record);
    },

    /**
     * 显示记录。
     *
     * @private
     * @param {Ext.panel.Table} table
     * @param {Ext.data.Model} record
     */
    showRecord: function (table, record) {
        var me = this;

        var contaienr = me.showStrategy.show(table, record);
        me.onContainerShow(contaienr, table, record);
    },

    /**
     * 当显示记录的容器显示后，会调用这个模板方法，实现类一般需要找到对应的表单，绑定相应的记录。
     *
     * @protected
     * @abstract
     * @param {Ext.container.Container} container
     * @param {Ext.panel.Table} table
     * @param {Ext.data.Model} record
     */
    onContainerShow: Ext.emptyFn
});